Scroll to navigation

NETDEVICE(7) Руководство программиста Linux NETDEVICE(7)

ИМЯ

netdevice - низкоуровневый доступ к сетевым устройствам Linux

ОБЗОР

#include <sys/ioctl.h>
#include <net/if.h>

ОПИСАНИЕ

В этой справочной странице описан интерфейс сокетов, используемый для настройки сетевых устройств.

Linux поддерживает несколько стандартных вызовов ioctl для настройки сетевых устройств. Они могут применяться для любого файлового дескриптора сокета независимо от семейства или типа сокета. В качестве параметра передается структура ifreq:


struct ifreq {

char ifr_name[IFNAMSIZ]; /* имя интерфейса */
union {
struct sockaddr ifr_addr;
struct sockaddr ifr_dstaddr;
struct sockaddr ifr_broadaddr;
struct sockaddr ifr_netmask;
struct sockaddr ifr_hwaddr;
short ifr_flags;
int ifr_ifindex;
int ifr_metric;
int ifr_mtu;
struct ifmap ifr_map;
char ifr_slave[IFNAMSIZ];
char ifr_newname[IFNAMSIZ];
char *ifr_data;
}; }; struct ifconf {
int ifc_len; /* размер буфера */
union {
char *ifc_buf; /* адрес буфера */
struct ifreq *ifc_req; /* массив структур */
}; };

Обычно, пользователь указывает имя нужного устройства в ifr_name. Все остальные поля структуры могут занимать единое пространство в памяти.

Вызовы ioctl

Если указано, вызов ioctl считается привилегированным, то для его использования необходимо иметь эффективный идентификатор пользователя 0 или мандат CAP_NET_ADMIN. В противном случае будет возвращено значение EPERM.

Возвращает в ifr_name имя интерфейса для заданного индекса ifr_ifindex. Это единственный вызов ioctl, возвращающий результат в ifr_name.
Возвращает индекс интерфейса в ifr_ifindex.
Считывает или устанавливает слово флагов устройства. В ifr_flags содержится битовая маска из следующих значений:
Флаги устройства
IFF_UP Интерфейс активен.
IFF_BROADCAST Установлен правильный широковещательный адрес.
IFF_DEBUG Флаг внутренней отладки.
IFF_LOOPBACK Интерфейс является устройством обратной петли.
IFF_POINTOPOINT Интерфейс является соединением точка-точка.
IFF_RUNNING Ресурсы выделены.
IFF_NOARP Нет протокола arp, адрес назначения 2-ого уровня (L2) не установлен.
IFF_PROMISC Интерфейс в режиме захвата (promiscuous).
IFF_NOTRAILERS Избегать использования концевиков (trailers).
IFF_ALLMULTI Принимать все многоадресные пакеты.
IFF_MASTER Мастер в связке балансирования нагрузки.
IFF_SLAVE Подчинённый в связке балансирования нагрузки.
IFF_MULTICAST Поддержка многоадресной передачи.
IFF_PORTSEL Может выбирать тип среды с помощью ifmap.
IFF_AUTOMEDIA Запущен автоматический выбор среды.
IFF_DYNAMIC Адреса теряются, если интерфейс становится неактивным.
IFF_LOWER_UP Драйвер L1 указывает на включение интерфейса (начиная с Linux 2.6.17)
IFF_DORMANT Драйвер L1 указывает на неактивность интерфейса (начиная с Linux 2.6.17)
IFF_ECHO Посылать пакеты echo (начиная с Linux 2.6.25)
Установка флага в слове флагов является привилегированной операцией, но считывать его может любой процесс.
Считает или устанавливает (индивидуальные) флаги устройства. Значение ifr_flags представляет собой битовую маску следующих значений:
Индивидуальные флаги
IFF_802_1Q_VLAN Интерфейс является устройством 802.1Q VLAN.
IFF_EBRIDGE Интерфейс является устройством моста Ethernet.
IFF_SLAVE_INACTIVE Интерфейс является неактивным подчинённым в связке балансирования нагрузки.
IFF_MASTER_8023AD Интерфейс является мастером в связке балансирования нагрузки 802.3ad.
IFF_MASTER_ALB Интерфейс является мастером связки балансирования нагрузки в режиме balanced-alb.
IFF_BONDING Интерфейс является мастером или подчинённым в связке балансирования нагрузки.
IFF_SLAVE_NEEDARP Интерфейсу требуется ARP для проверки.
IFF_ISATAP Интерфейс является интерфейсом RFC4214 ISATAP.

Установка расширенных (индивидуальных) флагов интерфейса является привилегированной операцией.

Назначает или получает адрес устройства с помощью ifr_addr. Назначение адреса интерфейса является привилегированной операцией. Для совместимости, принимаются или возвращаются только адреса семейства AF_INET.
Назначает или получает адрес назначения устройства точка-точка с помощью ifr_dstaddr. Для совместимости, принимаются или возвращаются только адреса семейства AF_INET. Присвоение адреса назначения является привилегированной операцией.
Назначает или получает широковещательный адрес устройства с помощью ifr_brdaddr. Для совместимости, принимаются или возвращаются только адреса семейства AF_INET. Присвоение широковещательного адреса является привилегированной операцией.
Назначает или получает маску сети устройства с помощью ifr_netmask. Для совместимости, принимаются или возвращаются только адреса семейства AF_INET. Назначение маски сети адреса является привилегированной операцией.
Считывает или устанавливает метрику устройства с помощью ifr_metric. В данный момент возможность не реализована; при считывании ifr_metric присваивается значение, равное нулю, а при попытке установки возвращается значение EOPNOTSUPP.
Считывает или устанавливает MTU (Maximum Transfer Unit — максимальную порцию данных) с помощью ifr_mtu. Установка MTU является привилегированной операцией. Установка слишком маленьких значений может привести к авариям в ядре.
Считывает или устанавливает аппаратный адрес устройства с помощью ifr_hwaddr. Аппаратный адрес задаётся в структуре sockaddr. В sa_family содержится тип устройства ARPHRD_*, в sa_data содержится аппаратный адрес L2, начиная с байта 0. Установка аппаратного адреса является привилегированной операцией.
Устанавливает аппаратный широковещательный адрес устройства с помощью ifr_hwaddr. Это привилегированная операция.
Считывает или устанавливает аппаратные параметры интерфейса с помощью ifr_map. Установка параметров является привилегированной операцией.


struct ifmap {

unsigned long mem_start;
unsigned long mem_end;
unsigned short base_addr;
unsigned char irq;
unsigned char dma;
unsigned char port; };

Назначение структуры ifmap зависит от драйвера устройства и архитектуры системы.

Добавляет или удаляет адрес из фильтров многоадресной передачи уровня связи устройства с помощью ifr_hwaddr. Это привилегированная операция. Альтернативный способ приведен в packet(7).
Считывает или устанавливает размер очереди передачи устройства с помощью ifr_qlen. Установка размера очереди передачи является привилегированной операцией.
Изменяет имя интерфейса, указанное в ifr_name, на ifr_newname. Это привилегированная операция. Она разрешена только тогда, когда интерфейс не активен.
Возвращает список адресов интерфейса (транспортный уровень). Для поддержки совместимости в данный момент возвращаются только адреса семейства AF_INET (IPv4). Пользователь передаёт в качестве аргумента вызова ioctl структуру ifconf. Она содержит в поле ifc_req указатель на массив структур ifreq, а в поле ifc_len его длину в байтах. Ядро заполняет структуры ifreq всеми текущими адресами третьего уровня (L3), связанными с интерфейсом и являющимися активными: ifr_name содержит имя интерфейса (eth0:1 и т. п.), ifr_addr содержит адрес. Ядро возвращает реальную длину массива в ifc_len. Если значение ifc_len равно начальной длине, то вероятно, переполнен буфер, и нужно попробовать ещё раз проделать то же самое с буфером большего размера, чтобы в него поместились все адреса. Если ошибок не было, то ioctl возвращает 0, в противном случае -1. Переполнение не является ошибкой.

Большинство протоколов поддерживают свои собственные вызовы ioctl для настройки предназначенных только для протокола параметров интерфейса. Подробности приведены в справочных страницах протоколов. Настройка адресов IP описывается в ip(7).

В дополнение ко всему, некоторые устройства поддерживают индивидуальные (private) вызовы ioctl. Здесь они не описаны.

ЗАМЕЧАНИЯ

Строго говоря, SIOCGIFCONF и другие вызовы ioctl, которые принимают или возвращают только адреса сокетов AF_INET, работают только с IP и принадлежат ip(7).

Имена интерфейсов, не имеющих адресов или установленного флага IFF_RUNNING, можно определить с помощью /proc/net/dev.

Локальные IP-адреса IPv6 можно найти в /proc/net или по rtnetlink(7).

ДЕФЕКТЫ

В glibc 2.1 отсутствует макрос ifr_newname в файле <net/if.h>. Добавьте следующие строки в вашу программу (чтобы обойти это):


#ifndef ifr_newname
#define ifr_newname     ifr_ifru.ifru_slave
#endif

СМОТРИТЕ ТАКЖЕ

proc(5), capabilities(7), ip(7), rtnetlink(7)

2012-04-26 Linux